package com.itheima.web.controller;

import cn.hutool.core.bean.BeanUtil;
import com.itheima.domain.User;
import com.itheima.service.UserService;
import com.itheima.util.JedisUtil;
import com.itheima.util.JwtUtil;
import com.itheima.util.SmsUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;

import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {


    @GetMapping("/sendSms")
    public String sendSms(String telephone) {
        System.out.println(telephone);

        // 生成随机字母这是
//         String smsCode = RandomStringUtils.randomAlphabetic(6);
        // 随机生成6位数
        String smsCode = RandomStringUtils.randomNumeric(6);
        // 验证码存入redis中
//        获取缓存中的数据
        Jedis jedis = JedisUtil.getJedis();
        // 存入redis中  300 是设置的存活时间
        jedis.setex("send_Code" + telephone, 300, smsCode);
        //3、调用阿里云发送短信验证码 使用的事SmsUti
        SmsUtils.sendSms(telephone,smsCode);
        // 打印验证码进行查看
        System.out.println("验证码：" + ":" + smsCode);
        // 关闭连接i 释放资源
        jedis.close();
        return "ok";

    }

    @Autowired
    UserService userService;

    @GetMapping("/login")
    public String login(String telephone, String smsCode) {

        // 从缓存中获取数据验证进行判断
        Jedis jedis = JedisUtil.getJedis();
        // 获取值
        String sysCode = jedis.get("send_Code" + telephone);
        //打印redis中的values值
        System.out.println(sysCode);
        // 进行判断  验证过有效期 返回 标志符与前端约定的
        if (sysCode == null) {
            return "0";
        }
        //1.1.2 验证码未过期，并且与页面输入的验证码匹配不上，验证码错误，返回标识符“0”
        if (!sysCode.equals(smsCode)) {
            return "0";
        }
        //1.2 基于手机号查询用户信息，如果查询不到用户，说明手机号在系统中不存在，提示手机号错误，返回标识符“1”
        User user = userService.finBytemple(telephone);
        if (user == null) {
            return "1";
        }
        // 最后都执行了就是保存啊登陆人的信息
//        清除redis中的记录的验证吗？
        jedis.close();

        //现在加入jwt进行权限的登陆校验
        //登录成功，保存登录人信息  基于JWT记录记录登录人信息
        // 使用huTool工具把对象转成map集合竟进行存储
        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(user);
        String token = JwtUtil.createToken(stringObjectMap);
        System.out.println(token);
        return token;
    }


    /**
     * 进行生成tooken的校验：
     * 已经调试完成使用火狐可以拦截其他
     * 这个调试必须使用redis 缓存可以读取
     */

    @GetMapping("/verify")
    public String verify(@RequestHeader("Authorization") String tooken) {
        //进行解密       //解析token是否有效;
        try {
            Map map = JwtUtil.parseToken(tooken);
            return "ok";
        } catch (Exception e) {
            e.printStackTrace();
            return "401";
        }


    }
}
